package com.woniu.utils;

import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @Classname MinioUtil
 * @Description TODO
 * @Date 2025/7/10 9:55
 * @Created by pc
 */
@Component
@Slf4j
public class MinioUtil {
    // 1.连接minio 需要什么：url username password
    @Resource
    private MinioClient minioClient;
    // 处理文件上传的方法
    public Map<String,Object> uploadFile(MultipartFile file,String bucketName) throws Exception {
        Map<String,Object> map = new HashMap<>();
        // 1.判断文件是否为空
        if (file.isEmpty() || file.getSize() == 0){
            map.put("code",500);
            map.put("msg","文件不能为空");
            return map;
        }
        // 2.判断桶是否为空 2.1 桶不存在 创建桶  2.2 存在直接上传
        boolean isExists = minioClient.bucketExists(bucketName);
        if(!isExists){
            // 创建桶
            minioClient.makeBucket(bucketName);
        }
        // 3.文件上传处理  存在问题：1.文件类型如何确定 2.重命名文件必须保证文件唯一
        String originalFilename = file.getOriginalFilename();  // 获取源文件的名称  1.jpg  2.png
        // 字符串截取 文件的类型  包头不包尾
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // UUID 保证文件唯一  桶的名称 + 时间戳 （距离1970年1月1日0:00的毫秒数）/UUID + suffix
        String fileName = bucketName + "_" + System.currentTimeMillis() + suffix;
        // 4.上传文件
        InputStream inputStream = file.getInputStream();
        // 向minio推文件
        PutObjectOptions putObjectOptions = new PutObjectOptions(inputStream.available(), -1);
        minioClient.putObject(bucketName,fileName,inputStream,putObjectOptions);
        log.info("文件上传成功");
        // 5.文件回显地址
        String url = minioClient.getObjectUrl(bucketName, fileName);
        map.put("code",200);
        map.put("url",url);
        return map;

    }

}
